Als nächstes wollen wir euch vorstellen, wie ihr generisch sortieren könnt.
Generisch sortieren bedeutet in dem Fall, dass ihr beliebige Daten gleicher Größe in
einem Array sortieren könnt.
Und dies könnt ihr mit der Funktion qsort machen.
Das besondere an der Stelle ist, dass qsort nicht weiß, was es sortiert.
Das heißt, es kennt nicht die Strukturen der Daten, die in dem Array liegen, das ihr sortiert
haben wollt.
Damit es nun aber entscheiden kann, ob ein bestimmtes Element in dem Array größer ist
als ein anderes, braucht es eine Vergleichsfunktion, die vom Aufrufer bereitgestellt werden muss.
Dieses Programmierschema nennt man Rückruf bzw. im Englischen auch Callback genannt.
Die Funktion qsort könnt ihr aus der Datei stdlib.h inkludieren.
Und die Signatur sieht so aus, dass man als erstes Argument ein Array übergibt, gefolgt
von einmal der Anzahl der Elemente in diesem Array plus der Größe eines einzelnen Elementes.
Das letzte Argument an qsort ist die eben angesprochene Rückruffunktion, die zum Vergleichen
der einzelnen Elemente herangezogen werden kann.
Auf diese Funktion werden wir gleich noch genauer eingehen.
Die Vergleichsfunktion hat als Rückgabewert ein Integer.
Damit kann angezeigt werden, ob zwei Elemente, die gerade betrachtet werden, entweder gleich
sind, in dem Fall wird 0 zurückgegeben, oder ob die beiden betrachteten Argumente unterschiedlich
sind.
Für den Fall, dass das erste Argument kleiner ist als das zweite, wird ein Wert kleiner
0 zurückgegeben und andernfalls ein Wert großer 0.
An diesem Beispiel können wir sehen, dass wir ein Array von Integern haben, das sieben
Elemente fasst.
Dabei ist das Array gefüllt mit den Werten 0 bis 6, wobei die Sortierung nicht ganz stimmt.
Die Breite eines Elementes ist die Größe eines Integers.
Das wäre im Fall von x8664 zum Beispiel 4 byte.
Nun wird die qsort-Funktion nach einem bestimmten Algorithmus hergehen und die einzelnen Elemente
innerhalb des Arrays vergleichen und umsortieren.
In diesem Fall ruft die qsort-Funktion die compare-Funktion für die Elemente an der
Stelle 3 und 4 auf und merkt, dass das erste Argument größer ist als das zweite.
Da dies der Sortierreihenfolge widerspricht, kann qsort nun die beiden Elemente umtauschen
und damit die Sortierreihenfolge wieder herstellen.
Wenn wir jetzt noch ein bisschen näher auf die Vergleichsfunktion eingehen, dann können
wir uns den Typ der Argumente anschauen.
Die Vergleichsfunktion erhält als Argument Zeiger auf Feldelemente.
Das sind Zeiger in das Array, das der qsort-Funktion als erstes Argument übergeben wird.
Hier fällt auf, dass kein konkreter Typ mit angegeben wird.
Das bedeutet, dass an die compare-Funktion prinzipiell ein Pointer auf Beliebiges übergeben
werden kann und dass die compare-Funktion nun selbst einen Cast auf den entsprechenden
Typ tätigen kann.
Der Zusatz const bedeutet an dieser Stelle, dass die compare-Funktion den Inhalt der Daten,
auf die gezeigt wird, nicht manipuliert.
Das bedeutet, sie greift nur lesend darauf zu.
Wenn wir eine Funktion schreiben wollen, die im vorherigen Beispiel genutzt werden kann,
um Integer-Werte in einem Array zu sortieren, kann dies in etwa so aussehen.
Wir schreiben eine Funktion, die einen Integer als Rückgabewert hat und zwei konstante Void-Pointer
als Argument erwartet.
Einmal den Pointer a, einmal den Pointer b.
Damit wir sinnvoll mit den Werten, die von a und b referenziert werden, arbeiten können,
Zugänglich über
Offener Zugang
Dauer
00:04:29 Min
Aufnahmedatum
2020-05-19
Hochgeladen am
2020-05-19 19:36:28
Sprache
de-DE